home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / Games / WHDLoad / Src / imager-examples / robocop2.imager.asm < prev    next >
Encoding:
Assembly Source File  |  2000-08-06  |  17.2 KB  |  879 lines

  1. ;*---------------------------------------------------------------------------
  2. ;  :Program.    robocop2.imager.asm
  3. ;  :Contents.    Imager for RoboCop 2
  4. ;  :Author.    Wepl
  5. ;  :Version.    $Id: robocop2.imager.asm 1.2 2000/08/04 17:10:49 jah Exp $
  6. ;  :History.    20.06.00 started
  7. ;        04.08.00 finished this complex install ;)
  8. ;  :Requires.    -
  9. ;  :Copyright.    Public Domain
  10. ;  :Language.    68000 Assembler
  11. ;  :Translator.    Barfly V2.9
  12. ;  :To Do.
  13. ;---------------------------------------------------------------------------*
  14. ;
  15. ;    Disk format:
  16. ;    Disk 1:        0-1    standard
  17. ;            2-159    $1800 bytes sync=8944 with directory at track 80
  18. ;    Disk 2:        0-159    $1800 bytes sync=8944 with directory at track 80
  19. ;
  20. ;    pos    len    contens
  21. ;    -4    4    aaaaaaaa
  22. ;    0    2    4489
  23. ;    2    2    aaaa
  24. ;    4    8    mfm: 0=?? 1=secnum 2=secs-before-gap 3=0
  25. ;    c    8    mfm: chksum
  26. ;    14    200    data odd
  27. ;    214    200    data even
  28. ;    414
  29. ;
  30. ;    tracklength is around $3387 (pal version)
  31. ;
  32. ;    directory:
  33. ;    $00    WORD    file number
  34. ;    $02    CHAR17    filename
  35. ;    $13    BYTE    rc for loader???
  36. ;    $14    LONG    default destination address
  37. ;    $18    LONG    length unpacked
  38. ;    $1c    LONG    length packed
  39. ;---------------------------------------------------------------------------*
  40.  
  41. ;DEBUG
  42.  
  43.     INCDIR    Includes:
  44.     INCLUDE    devices/trackdisk.i
  45.     INCLUDE    dos/dos.i
  46.     INCLUDE    intuition/intuition.i
  47.     INCLUDE    lvo/dos.i
  48.     INCLUDE    lvo/exec.i
  49.     INCLUDE    lvo/intuition.i
  50.     INCLUDE    patcher.i
  51.  
  52.     IFD BARFLY
  53.     ;OUTPUT    "C:Parameter/RoboCop2.Imager"
  54.     OUTPUT    "Develop:Installs/robocop2 install/RoboCop2.Imager"
  55.     BOPT    O+            ;enable optimizing
  56.     BOPT    OG+            ;enable optimizing
  57.     BOPT    ODd-            ;disable mul optimizing
  58.     BOPT    ODe-            ;disable mul optimizing
  59.     ENDC
  60.  
  61. ;======================================================================
  62.  
  63.     SECTION a,CODE
  64.  
  65.         moveq    #-1,d0
  66.         rts
  67.         dc.l    _Table
  68.         dc.l    "PTCH"
  69.  
  70. ;======================================================================
  71.  
  72. _Table        dc.l    PCH_ADAPTOR,.adname        ;name adaptor
  73.         dc.l    PCH_NAME,.name            ;description of parameter
  74.         dc.l    PCH_FILECOUNT,1            ;number of cycles
  75.         dc.l    PCH_DATALENGTH,.lengtharray    ;file lengths
  76.         dc.l    PCH_SPECIAL,.specialarray    ;functions
  77.         dc.l    PCH_STATE,.statearray        ;state texts
  78.         dc.l    PCH_MINVERSION,.patcherver    ;minimum patcher version required
  79.         dc.l    PCH_INIT,_Init            ;init routine
  80.         dc.l    PCH_FINISH,_Finish        ;finish routine
  81.         dc.l    PCH_ERRORINPARAMETER,_Finish    ;finish routine
  82.         dc.l    TAG_DONE
  83.  
  84. .lengtharray    dc.l    4
  85. .specialarray    dc.l    _Special
  86. .statearray    dc.l    .insertdisk
  87.  
  88. .adname        dc.b    "Done by Wepl.",0
  89. .name        dc.b    "RoboCop 2, Diskimager for HD-Install",0
  90. .patcherver    dc.b    "V1.05"
  91. .insertdisk    dc.b    'Please insert your original writepro-',10
  92.         dc.b    'tected disk into the source drive.',0
  93.     IFD BARFLY
  94.         dc.b    "$VER: "
  95.     DOSCMD    "WDate >T:date"
  96.     INCBIN    "T:date"
  97.         dc.b    0
  98.         dc.b    "$Id: robocop2.imager.asm 1.2 2000/08/04 17:10:49 jah Exp $"
  99.     ENDC
  100.     EVEN
  101.  
  102. ;======================================================================
  103.  
  104. _Init        moveq    #0,d0                ;source drive
  105.         move.l    PTB_INHIBITDRIVE(a5),a0        ;inhibit drive
  106.         jsr    (a0)
  107.         tst.l    d0
  108.         bne    .error
  109.         
  110.         moveq    #0,d0                ;source drive
  111.         move.l    PTB_OPENDEVICE(a5),a0        ;open source device
  112.         jsr    (a0)
  113.         tst.l    d0
  114.         bne    .error
  115.         rts
  116.  
  117. .error        bsr    _Finish
  118.         moveq    #-1,d0
  119.         rts
  120.  
  121. ;======================================================================
  122.  
  123. _Finish        moveq    #0,d0                ;source drive
  124.         move.l    PTB_ENABLEDRIVE(a5),a0        ;deinhibit drive
  125.         jmp    (a0)
  126.  
  127. ;======================================================================
  128.  
  129. BYTESPERTRACK    = $1800
  130. RAWREADLEN    = $6800
  131. SYNC        = $8944
  132.  
  133. ;======================================================================
  134.  
  135. _Special
  136.         moveq    #1,d6                ;disk number
  137.         moveq    #-1,d7                ;D7 = return code (default=error)
  138.         lea    .skip1,a4
  139.         bsr    _makedisk
  140.         move.l    d7,d0
  141.         bne    .end
  142.  
  143.         moveq    #2,d6                ;disk number
  144.         moveq    #-1,d7                ;D7 = return code (default=error)
  145.         lea    .skip2,a4
  146.         bsr    _makedisk
  147.         move.l    d7,d0
  148.  
  149. .end        rts
  150.  
  151. ;****************************************************************
  152. ;                PAL                             NTSC
  153. ;       DISK 1          DISK 2          DISK 1          DISK 2
  154. ;
  155. ;    AMIGA  42112    AMIGA      2    AMIGA  42384    AMIGA   3884
  156. ;                      CH1  24760                      CH1  24760
  157. ;                      CMP  84031                      CMP  84031
  158. ;                                    DATAE  32032
  159. ;   DATAL1 144716                   DATAL1 144716
  160. ;                   DATAL2 105816                   DATAL2 105816
  161. ;                   DATAL3 185356                   DATAL3 185356
  162. ;     FRNG  93164*    FRNG 170970     FRNG  93224*    FRNG  93224*
  163. ;      HI1  36511      HI1  36511      HI1  36511      HI1  36511
  164. ;                    MADEX  25340                    MADEX  25340
  165. ;      MU1  62800      MU1  62800      MU1  62800      MU1  62800
  166. ;      OAS  32032                      OAS  32032
  167. ;    PERMA  96080                    PERMA  96080
  168. ;     PIC1  42368                     PIC1  42368
  169. ;     PIC2  42368                     PIC2  42368
  170. ;     PIC3  42368                     PIC3  42368
  171. ;                     PIC4  42368                     PIC4  42368
  172. ;                     PIC5  42368                     PIC5  42368
  173. ;                     PIC6  42368                     PIC6  42368
  174. ;                     PIC7  42368                     PIC7  42368
  175. ;     PIC9  42368     PIC9  42368     PIC9  42368     PIC9  42368
  176. ;                     PICF  61568                     PICF  61568
  177. ;     PUZL 113632     PUZL 113632     PUZL  76012*    PUZL 113632
  178. ;      RB1  10290                      RB1  10290
  179. ;   SPERMA  53700                   SPERMA  53700
  180. ;     TITM 152520                     TITM 152520
  181. ;     TPIC  61568                     TPIC  61568
  182. ;
  183. ; *..packed bytekiller data
  184. ;****************************************************************
  185.  
  186.     IFD DEBUG
  187. .skip1
  188. .skip2        dc.l    0
  189.     ELSE
  190. .skip1        dc.l    .dn
  191.         dc.l    .puzl
  192.         dc.l    0
  193. .skip2        dc.l    .amiga
  194.         dc.l    .dn
  195.         dc.l    .frng
  196.         dc.l    .hi1
  197.         dc.l    .mu1
  198.         dc.l    .pic9
  199.         dc.l    0
  200. .dn        dc.b    "DN",0
  201. .frng        dc.b    "FRNG",0
  202. .amiga        dc.b    "AMIGA",0
  203. .hi1        dc.b    "HI1",0
  204. .mu1        dc.b    "MU1",0
  205. .pic9        dc.b    "PIC9",0
  206. .puzl        dc.b    "PUZL",0
  207.     EVEN
  208.     ENDC
  209.  
  210. _makedisk
  211. .idisk        move.l    d6,d0
  212.         bsr    _InsertDisk
  213.         tst.l    d0
  214.         beq    .nodisk
  215.         
  216.     ;check for disk in drive
  217.         move.l    (PTB_DEVICESOURCEPTR,a5),a1
  218.         move.w    #TD_CHANGESTATE,(IO_COMMAND,a1)
  219.         move.l    (4).w,a6
  220.         jsr    (_LVODoIO,a6)
  221.         tst.l    (IO_ACTUAL,a1)
  222.         bne    .idisk
  223.  
  224.     ;read allocation map and directory
  225.         move.w    #$3cc,d2
  226.         lea    (_map),a0
  227.         moveq    #12-1,d3
  228. .root        move.w    d2,d0
  229.         bsr    _loadsec
  230.         beq    .motoff
  231.         addq.w    #1,d2
  232.         add.w    #$200,a0
  233.         dbf    d3,.root
  234.         
  235.     IFD DEBUG
  236.     ;save directory and bitmap
  237.         move.l    #12*512,d0
  238.         moveq    #"0",d1
  239.         add.b    d6,d1
  240.         ror.l    #8,d1
  241.         move.l    d1,-(a7)
  242.         move.l    a7,a0
  243.         lea    (_map),a1
  244.         bsr    _WriteFile
  245.         addq.l    #4,a7
  246.     ENDC
  247.  
  248.     ;load and save each file
  249.         lea    (_dir),a2
  250. .nextfile    lea    (_file),a1
  251.  
  252.         move.l    a4,a3
  253. .ver        move.l    (a3)+,d0
  254.         beq    .go
  255.         move.l    d0,a6
  256.         lea    (2,a2),a0
  257. .chk        cmp.b    (a0)+,(a6)+
  258.         bne    .ver
  259.         tst.b    (-1,a0)
  260.         beq    .skip
  261.         bra    .chk
  262. .go
  263.         LEA    (_map+$38+$3cc),A3
  264.         move.l    ($1c,a2),d5
  265.         MOVE.W    D5,D0
  266.         MOVEQ    #9,D1
  267.         LSR.L    D1,D5
  268.         ANDI.W    #$01FF,D0
  269.         SEQ    D0
  270.         EXT.W    D0
  271.         ADD.W    D0,D5
  272.         MOVE.W    #$03CB,D4
  273.         move.w    (a2),d6
  274. .126        CMP.B    -(A3),D6
  275.         DBEQ    D4,.126
  276.         BNE.B    .146
  277.         MOVE.W    D4,D0
  278.         lea    (_sec),a0
  279.         BSR.W    _loadsec
  280.         beq    .motoff
  281.         bsr    _dec
  282.         SUBQ.W    #1,D4
  283.         BCS.B    .144
  284.         DBRA    D5,.126
  285.         BRA.B    .16C
  286.  
  287. .144        SUBQ.W    #1,D5
  288. .146        MOVE.W    #$03EF,D4
  289.         LEA    (_map+$38+$3d8),A3
  290. .14E        CMP.B    (A3)+,D6
  291.         DBEQ    D4,.14E
  292.         bne    .error
  293.         MOVE.W    D4,D0
  294.         NEG.W    D0
  295.         ADDI.W    #$07C7,D0
  296.         lea    (_sec),a0
  297.         bsr    _loadsec
  298.         beq    .motoff
  299.         bsr    _dec
  300.         SUBQ.W    #1,D4
  301.         DBRA    D5,.14E
  302. .16C
  303.         move.l    ($18,a2),d0
  304.         lea    (2,a2),a0
  305.         lea    (_file),a1
  306.         cmp.l    #"FRNG",(a0)
  307.         bne    .write
  308.     ;decrunch file FRNG
  309.         move.l    (4,a1),d0        ;unpacked length
  310.         movem.l    d0-d7/a0-a6,-(a7)
  311.         move.l    a1,a0
  312.         lea    (15000,a0),a1
  313.         bsr    _bytekiller
  314.         movem.l    (a7)+,d0-d7/a0-a6
  315.         add.w    #15000,a1
  316. .write        bsr    _WriteFile
  317.         beq    .error
  318.  
  319. .skip        add.w    #32,a2
  320.         tst.b    (2,a2)
  321.         bne    .nextfile
  322.         
  323.         moveq    #0,d7
  324. .error
  325.  
  326.     ;switch motor off
  327. .motoff        move.l    (PTB_DEVICESOURCEPTR,a5),a1
  328.         clr.l    (IO_LENGTH,a1)
  329.         move.w    #TD_MOTOR,(IO_COMMAND,a1)
  330.         move.l    (4).w,a6
  331.         jsr    (_LVODoIO,a6)
  332. .nodisk
  333.     ;enable drive
  334.         tst.b    d7
  335.         beq    .quit
  336.         bsr    _Finish
  337.         
  338. .quit        move.l    d7,d0
  339.         rts
  340.  
  341. ; a0=src a1=dest
  342. _dec        MOVE.W    #$01FF,D2
  343. .1B2        MOVEQ    #0,D1
  344.         SUBQ.W    #1,D2
  345.         BCS.B    .1CE
  346.         MOVE.B    (A0)+,D1
  347.         SUBQ.B    #1,D1
  348.         BVS.B    .1CE
  349.         ADDQ.B    #1,D1
  350.         BMI.B    .1D0
  351.         SUB.W    D1,D2
  352. .1C4        MOVE.B    (A0)+,(A1)+
  353.         DBRA    D1,.1C4
  354.         DBRA    D2,.1B2
  355. .1CE        RTS    
  356. .1D0        NEG.B    D1
  357.         MOVE.B    (A0)+,D0
  358. .1D4        MOVE.B    D0,(A1)+
  359.         DBRA    D1,.1D4
  360.         DBRA    D2,.1B2
  361.         RTS    
  362.  
  363. ; -> d0=sec a0=dest
  364. ; <- d0=succ
  365.  
  366. _loadsec    movem.l    d1-a6,-(a7)
  367.  
  368.     add.w    #24,d0
  369.  
  370.         move.l    a0,a3            ;a3 = dest
  371.  
  372.         ext.l    d0
  373.         divu    #12,d0
  374.         move.w    d0,d7            ;d7 = track
  375.         swap    d0
  376.         move.w    d0,d6            ;d6 = sector
  377.         cmp.w    (.lasttrk),d7
  378.         beq    .copysec
  379.  
  380.         move.w    d7,d2
  381.         bchg    #0,d2            ;swap sides
  382.         moveq    #5-1,d4            ;D4 = retries
  383. .readretry    bsr    _ReadTrack
  384.         tst.b    d0
  385.         beq    .readerr
  386.  
  387.         move.l    (PTB_SPACE,a5),a0    ;source
  388.         lea    (_decoded),a1        ;destination
  389.         bsr    _Decode
  390.         tst.b    d0
  391.         bne    .readok
  392.         dbf    d4,.readretry
  393.         bra    .readerr
  394.  
  395. .readok        lea    (.lasttrk),a0
  396.         move.w    d7,(a0)
  397.  
  398. .copysec    lea    (_decoded),a0
  399.         mulu    #$200,d6
  400.         add.w    d6,a0
  401.         move.l    #$200/4-1,d0
  402. .c        move.l    (a0)+,(a3)+
  403.         dbf    d0,.c
  404.         
  405.         moveq    #-1,d0
  406.  
  407.         movem.l    (a7)+,_MOVEMREGS
  408.         rts
  409.  
  410. .readerr    bsr    _ReadError
  411.         moveq    #0,d0
  412.         movem.l    (a7)+,_MOVEMREGS
  413.         rts
  414.  
  415. .lasttrk    dc.w    -1
  416.  
  417. ;======================================================================
  418. ; IN:    D2 = track
  419. ;    D6 = amount tracks left
  420. ; OUT:    D0 = error
  421.  
  422. _ReadTrack
  423.         and.l    #$ffff,d2
  424.  
  425.         move.l    d2,d0
  426.         move.l    d3,d1
  427.         bsr    _Display
  428.  
  429. SOURCE = 0    ;0=real 1=nomadwarp 2=wwarp
  430.  
  431.     IFEQ SOURCE
  432.     ;reading from a real disk
  433.         move.l    (PTB_DEVICESOURCEPTR,a5),a1
  434.         move.l    (PTB_SPACE,a5),(IO_DATA,a1)    ;track is to load in ptb_space
  435.         move.l    #RAWREADLEN,(IO_LENGTH,a1)    ;double length of track to decode data
  436.         move.l    d2,(IO_OFFSET,a1)
  437.         move.w    #TD_RAWREAD,(IO_COMMAND,a1)
  438.         move.b    #0,(IO_FLAGS,a1)
  439.         move.l    (4).w,a6
  440.         jsr    (_LVODoIO,a6)
  441.         move.l    (PTB_DEVICESOURCEPTR,a5),a1
  442.         tst.b    (IO_ERROR,a1)
  443.         seq    d0
  444.         rts
  445.     ENDC
  446.     IFEQ SOURCE-1
  447.     ;reading from a track-file written by nomad-warp
  448.         movem.l    d2-d4/a2-a3,-(a7)
  449.         lea    (.name),a0            ;format string
  450.         move.w    d2,d0
  451.         lsr.w    #1,d0
  452.         and.w    #1,d2
  453.         movem.w    d0/d2,-(a7)
  454.         move.l    a7,a1                ;arg array
  455.         lea    (_PutChar),a2
  456.         sub.l    #100-4,a7
  457.         move.l    a7,a3                ;buffer
  458.         move.l    (4),a6
  459.         jsr    (_LVORawDoFmt,a6)
  460.         move.l    a7,d1
  461.         move.l    #MODE_OLDFILE,d2
  462.         move.l    (PTB_DOSBASE,a5),a6
  463.         jsr    (_LVOOpen,a6)
  464.         add.l    #100,a7
  465.         move.l    d0,d4
  466.         beq    .err
  467.         move.l    d4,d1
  468.         move.l    (PTB_SPACE,a5),d2
  469.         move.l    #RAWREADLEN,d3
  470.         jsr    (_LVORead,a6)
  471.         move.l    d4,d1
  472.         jsr    (_LVOClose,a6)
  473.         moveq    #-1,d0
  474. .err        movem.l    (a7)+,d2-d4/a2-a3
  475.         rts
  476. .name        dc.b    "ram:track_%02d_head_%02d",0,0
  477.     ENDC
  478.     IFEQ SOURCE-2
  479.     ;reading from a wwarp image
  480.         movem.l    d2-d6,-(a7)
  481.         move.l    d2,d6
  482.         moveq    #0,d5
  483.         sub.w    #168*4,a7
  484.         lea    .name,a0
  485.         move.l    a0,d1
  486.         move.l    #MODE_OLDFILE,d2
  487.         move.l    (PTB_DOSBASE,a5),a6
  488.         jsr    (_LVOOpen,a6)
  489.         move.l    d0,d4
  490.         beq    .err
  491.         move.l    d4,d1
  492.         move.l    #16,d2
  493.         move.l    #OFFSET_BEGINNING,d3
  494.         jsr    (_LVOSeek,a6)            ;skip header
  495.         move.l    d4,d1
  496.         move.l    a7,d2
  497.         move.l    #168*4,d3
  498.         jsr    (_LVORead,a6)
  499.         cmp.l    d0,d3
  500.         bne    .close
  501.         moveq    #0,d0
  502.         moveq    #0,d1
  503.         moveq    #0,d2
  504. .0        cmp.w    d0,d6
  505.         beq    .1
  506.         move.l    (a7,d1.l),d3
  507.         and.l    #$ffff,d3
  508.         beq    .2
  509.         add.l    d3,d2
  510.         add.l    #16,d2                ;skip track headline
  511. .2        addq.l    #1,d0
  512.         addq.l    #4,d1
  513.         bra    .0
  514. .1        move.l    d4,d1
  515.         add.l    #16,d2                ;skip track headline
  516.         move.l    #OFFSET_CURRENT,d3
  517.         jsr    (_LVOSeek,a6)
  518.         move.l    d4,d1
  519.         move.l    (PTB_SPACE,a5),d2
  520.         move.l    #RAWREADLEN,d3
  521.         jsr    (_LVORead,a6)
  522.         cmp.l    d0,d3
  523.         bne    .close
  524.         moveq    #-1,d5
  525. .close        move.l    d4,d1
  526.         jsr    (_LVOClose,a6)
  527. .err        add.w    #168*4,a7
  528.         move.l    d5,d0
  529.         movem.l    (a7)+,d2-d6
  530.         rts
  531. .name        dc.b    "develop:cracks/nebulus2/neb2.wwp",0
  532.     EVEN
  533.     ENDC
  534.  
  535. ;======================================================================
  536. ; IN:    D0 = size
  537. ;    A0 = name
  538. ;    A1 = address
  539. ; OUT:    D0 = error
  540.  
  541. _WriteFile    movem.l    d2-d7,-(a7)
  542.         move.l    a0,-(a7)
  543.         move.l    d0,d3
  544.         moveq    #0,d5
  545.         move.l    a1,d6
  546.         move.l    (PTB_DOSBASE,a5),a6
  547.         move.l    a0,d1
  548.         move.l    #MODE_NEWFILE,d2
  549.         jsr    (_LVOOpen,a6)
  550.         move.l    d0,d4
  551.         beq    .err
  552.         move.l    d4,d1
  553.         move.l    d6,d2
  554.         jsr    (_LVOWrite,a6)
  555.         cmp.l    d0,d3
  556.         bne    .err
  557.         moveq    #-1,d5
  558.         bra    .close
  559. .err        jsr    (_LVOIoErr,a6)
  560.         sub.l    a0,a0                ;window
  561.         pea    (.gadgets)
  562.         pea    (.text)
  563.         pea    (.titel)
  564.         clr.l    -(a7)
  565.         pea    (EasyStruct_SIZEOF)
  566.         move.l    a7,a1                ;easyStruct
  567.         sub.l    a2,a2                ;IDCMP_ptr
  568.         move.l    d0,-(a7)
  569.         move.l    a7,a3                ;Args
  570.         move.l    (PTB_INTUITIONBASE,a5),a6
  571.         jsr    (_LVOEasyRequestArgs,a6)
  572.         add.w    #6*4,a7
  573. .close        move.l    d4,d1
  574.         beq    .1
  575.         jsr    (_LVOClose,a6)
  576. .1        move.l    d5,d0
  577.         movem.l    (a7)+,d1-d7
  578.         rts
  579.  
  580. .titel        dc.b    "Error",0
  581. .text        dc.b    "Dos Error %ld writing file '%s'",0
  582. .gadgets    dc.b    "OK",0
  583.     EVEN
  584.  
  585. ;======================================================================
  586. ; IN:    A0 = raw
  587. ;    A1 = dest
  588. ; OUT:    D0 = error
  589.  
  590. GetW    MACRO
  591.         cmp.l    a0,a5
  592.         bls    .error
  593.         move.l    (a0),\1
  594.         lsr.l    d5,\1
  595.     ENDM
  596. GetW2    MACRO
  597.         cmp.l    a2,a5
  598.         bls    .error
  599.         move.l    (a2),\1
  600.         lsr.l    d5,\1
  601.     ENDM
  602. GetWI    MACRO
  603.         GetW    \1
  604.         addq.l    #2,a0
  605.     ENDM
  606. GetWI2    MACRO
  607.         GetW2    \1
  608.         addq.l    #2,a2
  609.     ENDM
  610. GetLI    MACRO
  611.         GetWI    \1
  612.         swap    \1
  613.         GetWI    \2
  614.         move.w    \2,\1
  615.     ENDM
  616. GetLI2    MACRO
  617.         GetWI2    \1
  618.         swap    \1
  619.         GetWI2    \2
  620.         move.w    \2,\1
  621.     ENDM
  622. GetL2    MACRO
  623.         GetWI2    \1
  624.         swap    \1
  625.         GetW2    \2
  626.         move.w    \2,\1
  627.         subq.l    #2,a2
  628.     ENDM
  629.  
  630. _Decode        movem.l    d1-a6,-(a7)
  631.         move.l    a7,a6            ;A6 = return stack
  632.         lea    (RAWREADLEN,a0),a5    ;A5 = end of raw data
  633.  
  634.         move.w    #SYNC,d2        ;D2 = sync
  635.  
  636.     ;find sync
  637. .sync1        moveq    #16-1,d5        ;D5 = shift count
  638. .sync2        GetW    d0
  639.         cmp.w    d2,d0
  640.         beq    .sync3
  641. .sync_retry    dbf    d5,.sync2
  642.         addq.l    #2,a0
  643.         bra    .sync1
  644.  
  645. .sync3        movem.l    a0/a1,-(a7)        ;save this point for new try
  646.  
  647.         MOVE.L    #$55555555,D6
  648.         moveq    #12,d7            ;track count
  649.  
  650. .loop2        GetLI    d0,d3
  651.         cmp.l    #$8944aaaa,d0
  652.         bne    .fail
  653.         
  654.         lea    (4,a0),a2
  655.         bsr    .getlong
  656.         lsr.w    #8,d0
  657.         cmp.w    d7,d0            ;12 sectors before gap?
  658.         bne    .fail
  659.         
  660.         swap    d0
  661.         and.w    #$ff,d0
  662.         cmp.w    #12,d0            ;sector number
  663.         bhs    .fail
  664.         mulu    #$200,d0
  665.         lea    (a1,d0.w),a3        ;a3 = dest
  666.         
  667.         addq.l    #4,a0
  668.         addq.l    #4,a2
  669.         bsr    .getlong
  670.         move.l    d0,d4            ;checksum
  671.         
  672.         addq.l    #4,a0
  673.         lea    ($200,a0),a2
  674.         moveq    #$200/4-1,d2
  675. .loop        bsr    .getlong
  676.         move.l    d0,(a3)+
  677.         dbf    d2,.loop
  678.         
  679.         sub.w    #$200,a3
  680.         move.w    #$200/2-1,d3
  681.         moveq    #0,d2
  682.         moveq    #0,d1
  683. .crc        and.w    #15,d2
  684.         move.w    (a3)+,d0
  685.         rol.w    d2,d0
  686.         addx.w    d0,d1
  687.         addq.w    #1,d2
  688.         dbf    d3,.crc
  689.         
  690.         lsr.l    #8,d4
  691.         cmp.w    d4,d1
  692.         bne    .fail
  693.         
  694.         lea    (4,a2),a0        ;skip aaaaaaaa
  695.         
  696.         subq.w    #1,d7
  697.         bne    .loop2
  698.  
  699. .success    moveq    #-1,d0
  700. .quit        move.l    a6,a7
  701.         movem.l    (a7)+,d1-a6
  702.         rts
  703.  
  704. .fail        movem.l    (a7)+,a0/a1
  705.         bra    .sync_retry        ;try again
  706.  
  707. .error        moveq    #0,d0
  708.         bra    .quit
  709.  
  710. .getlong    GetLI    d0,d3
  711.         GetLI2    d1,d3
  712.         and.l    d6,d0
  713.         and.l    d6,d1
  714.         add.l    d0,d0
  715.         or.l    d1,d0
  716.         rts
  717.  
  718. ;======================================================================
  719. ; D0 = disk number
  720.  
  721. _InsertDisk    sub.l    a0,a0                ;window
  722.         pea    (.gadgets)
  723.         pea    (.text)
  724.         pea    (.titel)
  725.         clr.l    -(a7)
  726.         pea    (EasyStruct_SIZEOF)
  727.         move.l    a7,a1                ;easyStruct
  728.         sub.l    a2,a2                ;IDCMP_ptr
  729.         move.l    d0,-(a7)
  730.         move.l    a7,a3                ;Args
  731.         move.l    (PTB_INTUITIONBASE,a5),a6
  732.         jsr    (_LVOEasyRequestArgs,a6)
  733.         add.w    #6*4,a7
  734.         rts
  735.  
  736. .titel        dc.b    "Insert Disk",0
  737. .text        dc.b    "Insert your original disk #%ld",10
  738.         dc.b    "into the source drive !",0
  739. .gadgets    dc.b    "OK|Cancel",0,0
  740.  
  741. ;======================================================================
  742.  
  743. _ReadError    sub.l    a0,a0                ;window
  744.         pea    (.gadgets)
  745.         pea    (.text)
  746.         pea    (.titel)
  747.         clr.l    -(a7)
  748.         pea    (EasyStruct_SIZEOF)
  749.         move.l    a7,a1                ;easyStruct
  750.         sub.l    a2,a2                ;IDCMP_ptr
  751.         move.l    d2,-(a7)
  752.         move.l    a7,a3                ;Args
  753.         move.l    (PTB_INTUITIONBASE,a5),a6
  754.         jsr    (_LVOEasyRequestArgs,a6)
  755.         add.w    #6*4,a7
  756.         rts
  757.  
  758. .titel        dc.b    "Error",0
  759. .text        dc.b    "Can't read track %ld",0
  760. .gadgets    dc.b    "OK",0
  761.  
  762. ;======================================================================
  763. ; IN:    D0 = actual tracknumber
  764. ;    D1 = tracks left to do
  765.  
  766. _Display    movem.l    d0-d1/a0-a3/a6,-(a7)
  767.         lea    (.text),a0        ;format string
  768.         move.l    d1,-(a7)
  769.         move.l    d0,-(a7)
  770.         move.l    a7,a1            ;arg array
  771.         lea    (_PutChar),a2
  772.         sub.l    #100-8,a7
  773.         move.l    a7,a3            ;buffer
  774.         move.l    (4),a6
  775.         jsr    (_LVORawDoFmt,a6)
  776.         move.l    a7,a0
  777.         move.l    (PTB_DISPLAY,a5),a6
  778.         jsr    (a6)
  779.         add.l    #100,a7
  780.         movem.l    (a7)+,d0-d1/a0-a3/a6
  781.         rts
  782.  
  783. .text        dc.b    "reading track %ld",0
  784.  
  785. _PutChar    move.b    d0,(a3)+
  786.         rts
  787.  
  788. ;===============================================================
  789.  
  790. _bytekiller
  791.     MOVE.L    (A0)+,D0
  792.     MOVE.L    (A0)+,D1
  793.     ADDA.L    D0,A0
  794.     MOVE.L    (A0),D0
  795.     MOVEA.L    A1,A2
  796.     ADDA.L    D1,A2
  797.     MOVEQ    #3,D5
  798.     MOVEQ    #2,D6
  799.     MOVEQ    #$10,D7
  800. lbC000176    LSR.L    #1,D0
  801.     BNE.B    lbC00017C
  802.     BSR.B    lbC0001E0
  803. lbC00017C    BCS.B    lbC0001B0
  804.     MOVEQ    #8,D1
  805.     MOVEQ    #1,D3
  806.     LSR.L    #1,D0
  807.     BNE.B    lbC000188
  808.     BSR.B    lbC0001E0
  809. lbC000188    BCS.B    lbC0001CE
  810.     MOVEQ    #3,D1
  811.     MOVEQ    #0,D4
  812. lbC00018E    BSR.B    lbC0001E8
  813.     MOVE.W    D2,D3
  814.     ADD.W    D4,D3
  815. lbC000194    MOVEQ    #7,D1
  816. lbC000196    LSR.L    #1,D0
  817.     BNE.B    lbC00019C
  818.     BSR.B    lbC0001E0
  819. lbC00019C    ROXL.L    #1,D2
  820.     DBRA    D1,lbC000196
  821.     MOVE.B    D2,-(A2)
  822.     DBRA    D3,lbC000194
  823.     BRA.B    lbC0001DA
  824.  
  825. lbC0001AA    MOVEQ    #8,D1
  826.     MOVEQ    #8,D4
  827.     BRA.B    lbC00018E
  828.  
  829. lbC0001B0    MOVEQ    #2,D1
  830.     BSR.B    lbC0001E8
  831.     CMP.B    D6,D2
  832.     BLT.B    lbC0001C6
  833.     CMP.B    D5,D2
  834.     BEQ.B    lbC0001AA
  835.     MOVEQ    #8,D1
  836.     BSR.B    lbC0001E8
  837.     MOVE.W    D2,D3
  838.     MOVEQ    #12,D1
  839.     BRA.B    lbC0001CE
  840.  
  841. lbC0001C6    MOVEQ    #9,D1
  842.     ADD.W    D2,D1
  843.     ADDQ.W    #2,D2
  844.     MOVE.W    D2,D3
  845. lbC0001CE    BSR.B    lbC0001E8
  846. lbC0001D0    SUBQ.L    #1,A2
  847.     MOVE.B    (A2,D2.W),(A2)
  848.     DBRA    D3,lbC0001D0
  849. lbC0001DA    CMPA.L    A2,A1
  850.     BLT.B    lbC000176
  851.     RTS
  852.  
  853. lbC0001E0    MOVE.L    -(A0),D0
  854.     MOVE.W    D7,CCR
  855.     ROXR.L    #1,D0
  856.     RTS
  857.  
  858. lbC0001E8    SUBQ.W    #1,D1
  859.     MOVEQ    #0,D2
  860. lbC0001EC    LSR.L    #1,D0
  861.     BNE.B    lbC0001F6
  862.     MOVE.L    -(A0),D0
  863.     MOVE.W    D7,CCR
  864.     ROXR.L    #1,D0
  865. lbC0001F6    ROXL.L    #1,D2
  866.     DBRA    D1,lbC0001EC
  867.     RTS
  868.  
  869. ;===============================================================
  870.  
  871.     SECTION    b,BSS
  872.     
  873. _map        dsb    512*4
  874. _dir        dsb    512*8
  875. _decoded    dsb    $1800
  876. _sec        dsb    512
  877. _file        dsb    190000
  878.  
  879.